home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 142_01 / crcbuild.asm < prev    next >
Assembly Source File  |  1985-03-09  |  14KB  |  695 lines

  1. ;
  2. ;        CRCBUILD.ASM    version 1.0
  3. ;        by John L. Raff WB2MDG/KAPP8107
  4. ;         (built 830408FR)
  5. ;
  6. ;---> NOTE: MUST BE ASSEMBLED BY MAC <----
  7. ;
  8. ;CRCBUILD is a program to build a CP/M file in SIG/M 
  9. ;-CATALOG format and print
  10. ;a CYCLIC-REDUNDANCY-CHECK number based on the
  11. ;CCITT standard polynominal:
  12. ;   X^16 + X^15 + X^13 + X^7 + X^4 + X^2 + X + 1
  13. ;  
  14. ;Define true and false
  15. ;
  16. FALSE    EQU    0
  17. TRUE    EQU    NOT FALSE
  18. ;
  19. ;Conditional assembly switches
  20. ;
  21. STDCPM    EQU    TRUE    ;TRUE IS STANDARD CP/M
  22. ALTCPM    EQU    FALSE    ;TRUE IS H8 OR TRS-80
  23. NOSYS    EQU    FALSE    ;TRUE IF SYS FILES NOT WANTED
  24. ;
  25. ;System equates
  26. ;
  27. BASE    SET    0
  28.     IF    ALTCPM
  29. BASE    SET    4200H
  30.     ENDIF        ;ALTCPM
  31. ;
  32. ;Define write buffer size (presently set for 8k)
  33. ;
  34. BSIZE    EQU    8*1024    ;DISK WRITE BUFFER SIZE
  35. ;
  36. ;BDOS equates
  37. ;
  38. RDCON    EQU    1
  39. WRCON    EQU    2
  40. PRINT    EQU    9
  41. READCONSOLE    EQU    10    ;Read console buffer
  42. CSTAT    EQU    11
  43. OPEN    EQU    15
  44. SRCHF    EQU    17
  45. SRCHN    EQU    18
  46. READ    EQU    20
  47. STDMA    EQU    26
  48. BDOS    EQU    BASE+5
  49. FCB    EQU    BASE+5CH 
  50. FCBEXT    EQU    FCB+12
  51. FCBRNO    EQU    FCB+32
  52. FCB2    EQU    BASE+6CH
  53. STRLMT    EQU    80    ;STRING LENGTH LIMIT
  54. ;
  55. ;Program starts here
  56. ;
  57.     ORG    BASE+100H
  58. ;
  59.     MACLIB    SEQIO    ;DEFINE MACRO LIBRARY USED
  60.  
  61. CRCBUILD:
  62.     JMP    BEGIN    ;Jump around identification & alternate file name
  63.     DB    'CRCBUILD.COM 1.0 830408fr',0
  64. ;
  65. BEGIN:
  66.     XRA    A
  67.     STA    NAMQUAN    ;Zero the quantity of files read
  68.     LXI    H,0    ;GET STACK...
  69.     DAD    SP    ;POINTER SO WE CAN..
  70.     SHLD    STACK    ;SAVE IT
  71.     LXI    SP,STACK ;INITIALIZE LOCAL STACK
  72. BGN2:
  73.     CALL    CRLF    ;TURN UP A NEW LINE
  74.     CALL    ILPRT    ;Print the heading
  75.     DB    'CRCBUILD Ver 1.0 830224TH',CR,LF
  76.     DB    'CTL-S pauses, CTL-C aborts',CR,LF,0
  77.     LDA    FCB+1
  78.     CPI    ' '    ;SEE IF NAME THERE
  79.     JNZ    BEGIN2    ;YES, CONTINUE
  80.     LXI    D,FCB+2    ;Put total directory pattern
  81.     LXI    H,FCB+1    ;in FCB
  82.     MVI    M,'?'    ;All "?"
  83.     LXI    B,10    ;4 characters
  84.     CALL    MOVER    ;MOVE IT
  85.     JMP    BEGIN2    ;Go get um
  86. ;
  87. THRNUM?:    ;Check for three ascii numbers
  88.     CALL    TWONUM?
  89.     RNZ        ;Return if not numbers
  90.     CALL    NUM?
  91.     RZ        ;Return if a number
  92.     CPI    '.'    ;Check for a period
  93.     RNZ        ;Return if not a period
  94.     DCX    H    ;Otherwise back up one character
  95.     DCR    B    ;And one count
  96.     CMP    A    ;Set zero flag
  97.     RET
  98. ;
  99. TWONUM?:
  100.     CALL    NUM?
  101.     RNZ
  102. NUM?:
  103.     MOV    A,M    ;Get the character
  104.     INX    H    ;For next character
  105.     INR    B    ;Increment for next count
  106.     CPI    '0'    ;Is it less than 0
  107.     JC    NUMNOT    ;Branch if it is
  108.     CPI    '9'+1    ;Is it greater than 9?
  109.     JNC    NUMNOT
  110.     CMP    A    ;Set zero flag
  111.     RET
  112. NUMNOT:
  113.     CPI    '0'    ;Should not be equal, reset zero flag
  114.     RET
  115. ;
  116. BEG2NG:
  117.     CALL    ILPRT
  118.     DB    CR,LF,'Incorrect characters',CR,LF,0
  119. ;
  120. BEGIN2:
  121.     CALL    ILPRT
  122.     DB    'Enter -CATALOG.xxx number (three digits) -',0
  123.     LXI    D,STR4    ;Point to string 4
  124.     MVI    A,5    ;Indicate size of buffer 
  125.     STAX    D
  126.     MVI    C,READCONSOLE    ;Read console buffer
  127.     CALL    BDOS    ;Go get the string
  128.     LXI    H,STR4+1    ;Point to quantity characters entered
  129.     MOV    C,M    ;Get the count
  130.     MVI    A,3    ;Check for three characters
  131.     CMP    C    ;In buffer
  132.     JNZ    BEG2NG    ;Branch if not 3 characters
  133.     MVI    B,0    ;Zero counter
  134.     INX    H    ;Point to first character
  135. BEG2A:
  136.     CALL    NUM?    ;Is it a decimal number?
  137.     JNZ    BEG2NG    ;Branch if not a decimal number
  138.     MOV    A,B    ;Check quantity of characters
  139.     CPI    3
  140.     JNZ    BEG2A    ;Branch if not end of characters yet
  141.     MVI    M,0    ;Ensure termination of string
  142.     LXI    H,STR4+2    ;Copy number into file string
  143.     LXI    D,FNAME1
  144.     LXI    B,3        ;Count
  145.     CALL    MOVER
  146.     MVI    A,'F'    ;Indicate write file open
  147.     STA    FFLAG
  148. ;
  149. ;'Declare' FCB for output file
  150. ;(temporarily named -CATALOG.$$$)
  151. ;
  152.     FILE    OUTFILE,CATALOG,,-CATALOG,$$$,BSIZE
  153. ;
  154. AGAIN:    LXI    SP,STACK ;RE-INIT STACK POINTER
  155.     MVI    A,0    ;Indicate in building phase
  156.     STA    WHICH    ;Save flag
  157.     CALL    MFNAME    ;SEARCH FOR NAMES
  158.     JNC    NAMTST    ;ANOTHER FOUND, PRINT NAME
  159. AGN2:    
  160.     LDA    MFFLG2    ;NOTHING FOUND, CHECK...
  161.     ORA    A    ;... NAME FOUND FLAG
  162.     JZ    DONE    ;AT LEAST ONE WAS FOUND
  163.     CALL    ABEXIT    ;PRINT MSG, THEN EXIT
  164.     DB    '++FILE NOT FOUND++$'
  165. ;
  166. DONE:            ;Close -CATALOG.$$$
  167.     LXI    H,FNAME1
  168.     LXI    D,DONEX
  169.     LXI    B,3
  170.     CALL    MOVER
  171.     CALL    ILPRT
  172.     DB    CR,LF,'SIG-M Library -CATALOG Volume Number-'
  173. DONEX:
  174.     DB    'NNN, ',0
  175. DONEY:
  176.     LDA    NAMQUAN
  177.     CALL    SHWDC
  178.     CALL    ILPRT
  179.     DB    ' Files cataloged.',CR,LF,0
  180. ;
  181.     FINIS    CATALOG
  182. ;
  183.     LXI    H,STR4+2    ;Point to beginning of string
  184.     LXI    D,FCBFINAL+9    ;Location of Name TYPE
  185.     LXI    B,3    ;Quantity to move
  186.     CALL    MOVER
  187. ;
  188. ;Build FCB for final name of -CATALOG.nnn
  189. ;
  190.     FILE    SETFILE, FINAL,,-CATALOG,NNN
  191. ;
  192. ;    Erase any existing old file
  193. ;
  194.     ERASE FINAL
  195. ;
  196. ;    Rename -CATALOG.$$$ to -CATALOG.NNN
  197.     RENAME    FINAL,CATALOG
  198. ;
  199. ;Now exit to CP/M
  200. DONE2:    
  201.     CALL    MSGEXIT    ;PRINT DONE, THEN EXIT
  202.     DB    CR,LF,'DONE$'
  203. ;
  204. ;Test for names to ignore
  205. ;
  206. NAMTST:    IF    NOSYS
  207.     LDA    FCB+10    ;GET SYS ATTRIBUTE
  208.     ANI    80H    ;IS IT SYS?
  209.     JNZ    AGAIN    ;YES, IGNORE THIS FILE
  210.     ENDIF        ;NOSYS
  211. ;
  212. ;Ignore files with .$$$ filetype (they are usually
  213. ;zero-length and clutter up our display.  We also
  214. ;want to ignore our own CRCKLIST.$$$ temporary file).
  215. ;
  216.     LXI    H,FCB+9    ;POINT TO FILETYPE IN FCB
  217.     PUSH    H    ;May need pointer for BAD check
  218.     CALL    TSTBAD    ;CHECK FOR .$$$ FILES
  219.     JZ    AGAIN    ;IF ZERO FLAG, IGNORE THEM
  220.     POP    H    ;Restore pointer
  221.     CALL    BADTYP    ;Check for .BAD files
  222.     JZ    AGAIN    ;Branch if it is
  223. ;
  224. NAMTS2:
  225.     CALL    ILPRT    ;PRINT:
  226.     DB    CR,LF
  227. FNAME1:
  228.     DB    'NNN.',0
  229. ;
  230.     LDA    NAMQUAN    ;Get quantity of name
  231.     INR    A    ;Increment count
  232.     STA    NAMQUAN
  233.     CALL    SHWDC    ;Show the count
  234. ;
  235. ;Move 8 characters from FCB+1 to FNAME
  236. ;
  237.     LXI    H,FCB+1
  238.     LXI    D,FNAME
  239.     LXI    B,8
  240.     CALL    MOVER
  241. ;Move 3 characters from FCB+9 to FNAME+9
  242.     LXI    H,FCB+9
  243.     LXI    D,FNAME+9
  244.     LXI    B,3
  245.     CALL    MOVER
  246. ;Now print filename.type
  247.     CALL    ILPRT
  248.     DB    '    '
  249. FNAME:
  250.     DB    'XXXXXXXX.XXX  ',0
  251. FNAME2:
  252.     CALL    OPN    ;Open file and build CRC
  253.     JZ    AGAIN    ;Branch if bad open or read
  254.     JMP    ABEXT2    ;Otherwise get out
  255. ;
  256. ;Open the file
  257. ;
  258. OPN:
  259.     LXI    D,FCB
  260.     MVI    C,OPEN
  261.     CALL    BDOS
  262.     INR    A
  263.     JNZ    RDINIT
  264.     CALL    ILPRT
  265.     DB    '++Open Failed++',0
  266.     JMP    BADRET    ;Indicate Bad open
  267. ;
  268. ;Initialize CRC to zero and set Bufad to cause initial read
  269. ;
  270. RDINIT:
  271.     LXI    H,0
  272.     SHLD    REM    ;Init remainder to zero
  273.     SHLD    QUANEK    ;Quantity of eighth k
  274.     LXI    H,BASE+100H
  275.     SHLD    BUFAD    ;Init buffer address
  276. ;
  277. ;This is the read loop
  278. ;
  279. READIT:
  280.     LHLD    BUFAD
  281.     MOV    A,H    ;Time to read?
  282.     CPI    BASE SHR 8    ;End of buffer?
  283.     JZ    NORD
  284.     MVI    C,CSTAT
  285.     CALL    BDOS    ;Chck for operator abort
  286.     ORA    A
  287.     JZ    READ2    ;Branch if nothing from operator
  288.     MVI    C,RDCON
  289.     CALL    BDOS    ;Get character from operator
  290.     CPI    'C'-40h    ;Control C?
  291.     JZ    ABEXT2    ;Branch if yes, exit
  292. ;
  293. READ2:
  294.     LXI    D,FCB
  295.     MVI    C,READ    ;Read another sector of file
  296.     CALL    BDOS
  297.     ORA    A    ;Check return code
  298.     JNZ    FINISH    ;Error or EOF
  299.     LHLD    QUANEK    ;Get quantity of eighth K
  300.     INX    H    ;Add 1
  301.     SHLD    QUANEK    ;Put back
  302.     LXI    H,BASE+80H    ;Bufer location
  303. ;
  304. NORD:
  305.     MOV    A,M    ;Get file character
  306.     STA    MESS    ;Save for DIVP
  307.     INX    H
  308.     SHLD    BUFAD    ;Update buffer address
  309.     CALL    DIVP    ;Calculate new CRC
  310.     JMP    READIT    ;GO READ MORE CHARACTERS
  311. ;
  312. FINISH:    CPI    1    ;NORMAL END-OF-FILE?
  313.     JNZ    FILERR    ;NO, IT WAS A READ ERROR
  314.     LHLD    QUANEK    ;Get quantity of eighth K
  315.     LXI    B,7
  316.     DAD    B    ;Round up to next K
  317.     DAD    H    ;Turn into full K
  318.     DAD    H    ;In "H" register
  319.     DAD    H
  320.     DAD    H
  321.     DAD    H
  322.     MOV    A,H
  323.     CALL    SHWDEC    ;Show Number of K
  324.     CALL    ILPRT
  325.     DB    'K   ',0 
  326.     LDA    REM+1    ;GET MSP OF CRC
  327.     CALL    HEXO    ;PRINT IT
  328.     MVI    A,' '
  329.     CALL    TYPE    ;TYPE A SPACE
  330.     LDA    REM    ;GET LSP OF CRC
  331.     CALL    HEXO    ;PRINT IT
  332. GOODRET:
  333.     XRA    A
  334.     RET        ;Return to caller with zero flag set
  335. ;
  336. FILERR:
  337.     CALL    ILPRT    ;Print the message and return
  338.     DB    TAB,TAB,'++FILE READ ERROR++',CR,LF,0
  339. BADRET:            ;General bad return location
  340.     XRA    A    ;Set zero flag
  341.     INR    A    ;reset zero flag
  342.     RET        ;Return to caller
  343. ;
  344. ;---------------------------------------------
  345. ;An 8080 routine for generating a CYCLIC-
  346. ;REDUNDANCY-CHECK.  Character leaves that
  347. ;character in location REM.  By Fred Gutman.
  348. ;From 'EDN' magazine, June 5, 1979 issue, page 84.
  349. ;
  350. DIVP:
  351.     LHLD    REM    ;GET REMAINDER
  352.     MOV    A,H
  353.     ANI    128    ;Q-BIT MASK
  354.     PUSH    PSW    ;SAVE STATUS
  355.     DAD    H    ;2 X R(X)
  356.     LDA    MESS    ;MESSAGE BIT IN LSB
  357.     ADD    L
  358.     MOV    L,A
  359.     POP    PSW
  360.     JZ    QB2    ;IF Q-BIT IS ZERO
  361. ;
  362. QB:
  363.     MOV    A,H
  364.     XRI    0A0H    ;MS HALF OF GEN. POLY
  365.     MOV    H,A
  366.     MOV    A,L
  367.     XRI    97H    ;LS HALF OF GEN. POLY
  368.     MOV    L,A
  369. ;
  370. QB2:
  371.     SHLD    REM
  372.     RET
  373. ;--------------------------------------------
  374. ;
  375. ;Hex output
  376. ;
  377. HEXO:
  378.     PUSH    PSW    ;SAVE FOR RIGHT DIGIT
  379.     RAR        ;RIGHT..
  380.     RAR        ;..JUSTIFY..
  381.     RAR        ;..LEFT..
  382.     RA